#include "byteset.h"
#include <QtDebug>
#include <QString>
#include <QMessageBox>
#include <QApplication>

//static const char upByte[] = {0x02, 0xff, 0x39, 0x39, 0x30, 0x30, 0x33, 0x31, 0x31, 0x31};
ByteSet::ByteSet()
{

}
ByteSet::~ByteSet()
{
}
//初始化byte
QByteArray ByteSet::initEngine2ComByte()
{
    QByteArray byte;
    byte.resize(7);
    byte[0] = 0x38;
    byte[1] = 0x30;

    byte[2] = 0x30;
    byte[3] = 0x30;
    byte[4] = 0x32;
    byte[5] = 0x31;
    byte[6] = 0x31;
    QList<int> dataList;
    dataList.append(31);
    dataList.append(31);
    byte += calcuCheckBit("68", 92, dataList);
    byte = makeByte(byte);
//    emit sendByte(byte);
    printByte(byte);


    return byte;
}
void ByteSet::printByte(QByteArray byte)
{
    qDebug()<<"byte::"<<QString(byte);
}
//开始测量
QByteArray ByteSet::startTest2ComByte()
{
    QByteArray byte;
    byte.resize(6);
    byte[0] = 0x30;
    byte[1] = 0x31;//功能位

    byte[2] = 0x30;
    byte[3] = 0x30;
    byte[4] = 0x31;//长度位

    byte[5] = 0x31;
    QList<int> dataList;
    dataList.append(31);
    byte += calcuCheckBit("61", 91, dataList);
    byte = makeByte(byte);
//    qDebug()<<"init Byte:"<<byte;
    return byte;
}
QByteArray ByteSet::upTap()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x01; //上管夹阀
    byte[7] = 0x31; //打开
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("01");
    dataList.append("31");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::upTap0()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x01; //上管夹阀
    byte[7] = 0x30; //关闭
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("01");
    dataList.append("30");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::downTap()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x02; //下管夹阀
    byte[7] = 0x31; //打开
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("02");
    dataList.append("31");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::downTap0()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x02; //下管夹阀
    byte[7] = 0x30; //
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("02");
    dataList.append("30");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::yansi()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x03; //功能
    byte[7] = 0x31; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("03");
    dataList.append("31");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::yansi0()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x03; //功能
    byte[7] = 0x30; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("03");
    dataList.append("30");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::lvzui()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x04; //功能
    byte[7] = 0x31; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("04");
    dataList.append("31");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::lvzui0()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x04; //功能
    byte[7] = 0x30; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("04");
    dataList.append("30");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::dingzhen()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x05; //功能
    byte[7] = 0x31; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("05");
    dataList.append("31");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::dingzhen0()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x05; //功能
    byte[7] = 0x30; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("05");
    dataList.append("30");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::yansitongfeng()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x06; //功能
    byte[7] = 0x31; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("06");
    dataList.append("31");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::yansitongfeng0()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x06; //功能
    byte[7] = 0x30; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("06");
    dataList.append("30");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::lvzuitongfeng()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x07; //功能
    byte[7] = 0x31; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("07");
    dataList.append("31");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::lvzuitongfeng0()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x07; //功能
    byte[7] = 0x30; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("07");
    dataList.append("30");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::tongfengxuanze()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x08; //功能
    byte[7] = 0x31; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("08");
    dataList.append("31");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::tongfengxuanze0()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x08; //功能
    byte[7] = 0x30; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("08");
    dataList.append("30");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::chouxi()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x09; //功能
    byte[7] = 0x31; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("09");
    dataList.append("31");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::chouxi0()
{
    QByteArray byte;
    byte.resize(8);
    byte[0] = 0x39;
    byte[1] = 0x39;

    byte[2] = 0x30; //长度
    byte[3] = 0x30;
    byte[4] = 0x33;

    byte[5] = 0x31; //吸阻
    byte[6] = 0x09; //功能
    byte[7] = 0x30; //开关
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("09");
    dataList.append("30");
    byte += calCuCheckBitNew("72", 93, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::stopTest2ComByte()
{
    QByteArray byte;
    byte.resize(6);
    byte[0] = 0x30;
    byte[1] = 0x31;//功能位

    byte[2] = 0x30;
    byte[3] = 0x30;
    byte[4] = 0x31;//长度位

    byte[5] = 0x32;
    QList<int> dataList;
    dataList.append(32);
    byte += calcuCheckBit("61", 91, dataList);
    byte = makeByte(byte);
//    qDebug()<<"init Byte:"<<byte;
    return byte;
}
//样品参数下发
QByteArray ByteSet::sampleInfoSend2Com()
{
    QByteArray byte;
    byte.resize(9);
    byte[0] = 0x30;
    byte[1] = 0x33;

    byte[2] = 0x30;
    byte[3] = 0x30;
    byte[4] = 0x36;

    byte[5] = 0x31;
    byte[6] = 0x30;
    byte[7] = 0x30;
    byte[8] = 0x30;

    QList<int> dataList;
    dataList.append(31);
    dataList.append(30);
    dataList.append(30);
    dataList.append(30);
    if(suctionStrList.contains("开吸阻"))
    {
        QByteArray tbyte;
        tbyte.resize(1);
        tbyte[0] = 0x31;
        byte += tbyte;
//        byte[9] = 0x31;
        dataList.append(31);
    }
    else
    {
//        byte[9] = 0x30;
        QByteArray tbyte;
        tbyte.resize(1);
        tbyte[0] = 0x30;
        byte += tbyte;
        dataList.append(30);
    }
    if(suctionStrList.contains("闭吸阻"))
    {
//        byte[10] = 0x31;
        QByteArray tbyte;
        tbyte.resize(1);
        tbyte[0] = 0x31;
        byte += tbyte;
        dataList.append(31);
    }
    else
    {
//        byte[10] = 0x30;
        QByteArray tbyte;
        tbyte.resize(1);
        tbyte[0] = 0x30;
        byte += tbyte;
        dataList.append(30);
    }
    byte += calcuCheckBit("63", 96, dataList);
    byte = makeByte(byte);
    return byte;
}
QByteArray ByteSet::systemInfoSend2Com()
{
    QByteArray byte;
    byte.resize(7);
    byte[0] = 0x30;
    byte[1] = 0x36;

    byte[2] = 0x30;
    byte[3] = 0x30;
    byte[4] = 0x34; //数据length为4

    byte[5] = 0x31; //31代表吸阻
    byte[6] = 0x31; //31代表保持时间
    QString hex = QString("%1").arg(holdTime, 4, 16, QLatin1Char('0'));  // 保留6位，不足补零
    byte += QByteArray::fromHex(hex.toLatin1());    //数据
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("31");
//    dataList.append(hex.left(2).toInt());
//    int aa = hex.left(2).toInt();
//    dataList.append(hex.right(2).toInt());
//    int bb = hex.right(2).toInt();
    bool ok;
//    int aa = hex.left(2).toInt(&ok, 16);
//    int bb = hex.right(2).toInt(&ok, 16);
    dataList.append(hex.left(2));
    dataList.append(hex.right(2));
    byte += calCuCheckBitNew("66", 94, dataList);
    byte = makeByte(byte);
    //test
    printByte(byte);
    return byte;
}
//补充样品指令
QByteArray ByteSet::appendSample2Com()
{
    QByteArray byte;
    byte.resize(6);
    byte[0] = 0x30;
    byte[1] = 0x37;

    byte[2] = 0x30;
    byte[3] = 0x30;
    byte[4] = 0x31;

    byte[5] = 0x02;
    QList<QString> dataList;
    dataList.append("02");
    byte += calCuCheckBitNew("67", 91, dataList);
    byte = makeByte(byte);

    return byte;
}
QByteArray ByteSet::cleanBox2Com()
{
    QByteArray byte;
    byte.resize(6);
    byte[0] = 0x30;
    byte[1] = 0x37;

    byte[2] = 0x30;
    byte[3] = 0x30;
    byte[4] = 0x31;

    byte[5] = 0x01;
    QList<QString> dataList;
    dataList.append("01");
    byte += calCuCheckBitNew("67", 91, dataList);
    byte = makeByte(byte);

    return byte;
}
QByteArray ByteSet::caliZero2Com()
{
    QByteArray byte;
    byte.resize(7);
    byte[0] = 0x30;
    byte[1] = 0x35;

    byte[2] = 0x30;
    byte[3] = 0x30;
    byte[4] = 0x32;

    byte[5] = 0x31;
    byte[6] = 0x31;//吸阻零点
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("31");
    byte += calCuCheckBitNew("65", 92, dataList);
    byte = makeByte(byte);

    return byte;
}
QByteArray ByteSet::caliSuccess2Com()
{
    QByteArray byte;
    byte.resize(7);
    byte[0] = 0x30;
    byte[1] = 0x35;

    byte[2] = 0x30;
    byte[3] = 0x30;
    byte[4] = 0x32;

    byte[5] = 0x31;
    byte[6] = 0x36;//校准完成指令
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("36");
    byte += calCuCheckBitNew("65", 92, dataList);
    byte = makeByte(byte);

    return byte;
}
QByteArray ByteSet::caliStandardValue2Com()
{
    QByteArray byte;
    byte.resize(7);
    byte[0] = 0x30;
    byte[1] = 0x35;

    byte[2] = 0x30;
    byte[3] = 0x30;
    byte[4] = 0x34;

    byte[5] = 0x31;//吸阻
    byte[6] = 0x32;//吸阻校准标准值
    /*
    result +=  QString::number(model).toInt(0, 16);
    result +=  QString::number(address).toInt(0, 16);
    result +=  QString::number(data).toInt(0, 16);
    //将校验位结果转换为16进制byte返回。
    QString test = QString("%1").arg(result, 2, 16, QLatin1Char('0'));
    QByteArray rArray = QByteArray::fromHex(test.toLatin1());
*/
//    QString value = QString("%1").arg(standardValue.toInt(0, 16), 4, 16, QLatin1Char('0'));
    QString value = QString("%1").arg(standardValue.toInt(), 4, 16, QLatin1Char('0'));
    QByteArray tByte = QByteArray::fromHex(value.toLatin1());
    byte += tByte;
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("32");
    dataList.append(value.left(2));
//    dataList.append(value.mid(2, 2));
    dataList.append(value.right(2));
    byte += calCuCheckBitNew("65", 94, dataList);
    byte = makeByte(byte);

    return byte;
}
QByteArray ByteSet::caliCancle2Com()
{
    QByteArray byte;
    byte.resize(7);
    byte[0] = 0x30;
    byte[1] = 0x35;

    byte[2] = 0x30;
    byte[3] = 0x30;
    byte[4] = 0x32;

    byte[5] = 0x31;
    byte[6] = 0x35;//取消校准
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("35");
    byte += calCuCheckBitNew("65", 92, dataList);
    byte = makeByte(byte);

    return byte;
}
QByteArray ByteSet::caliCheck2Com()
{
    QByteArray byte;
    byte.resize(7);
    byte[0] = 0x30;
    byte[1] = 0x35;

    byte[2] = 0x30;
    byte[3] = 0x30;
    byte[4] = 0x32;

    byte[5] = 0x31;
    byte[6] = 0x37;//校准验证
    QList<QString> dataList;
    dataList.append("31");
    dataList.append("37");
    byte += calCuCheckBitNew("65", 92, dataList);
    byte = makeByte(byte);

    return byte;
}
//拼接指令头尾
QByteArray ByteSet::makeByte(QByteArray tByte)
{
    QByteArray byte;
    byte.resize(2);
    byte[0] = 0x02;
    byte[1] = 0xFF; //包头
    byte.append(tByte);
    QByteArray endByte;
    endByte.resize(3);
    endByte[0] = 0x03;
    endByte[1] = 0x0D;
    endByte[2] = 0x0A;//包尾
    byte.append(endByte);
    return byte;
}
//计算校验位
QByteArray ByteSet::calcuCheckBit(QString gongneng, int length, QList<int> dataList)
{
//    QByteArray tAarray = QByteArray::fromHex(gongneng.toLatin1());
    int result = gongneng.toInt(0, 16);
    result += QString::number(length).toInt(0, 16);
    for(int i = 0; i < dataList.count(); i++)
    {
        result += QString::number(dataList.at(i)).toInt(0, 16);
    }
    QString resultStr = QString("%1").arg((~result) + 1, 4, 16, QLatin1Char('0'));
    resultStr = resultStr.right(4);
    QByteArray array = QByteArray::fromHex(resultStr.toLatin1());
    return array;
}
//计算校验位
QByteArray ByteSet::calCuCheckBitNew(QString gongneng, int length, QList<QString> dataList)
{
//    QByteArray tAarray = QByteArray::fromHex(gongneng.toLatin1());
    int result = gongneng.toInt(0, 16);
    result += QString::number(length).toInt(0, 16);
    for(int i = 0; i < dataList.count(); i++)
    {
        result += dataList.at(i).toInt(0, 16);
    }
    QString resultStr = QString("%1").arg((~result) + 1, 4, 16, QLatin1Char('0'));
    resultStr = resultStr.right(4);
    QByteArray array = QByteArray::fromHex(resultStr.toLatin1());
    return array;
}
